package com.udg.goodmorning.tweet;

import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.widget.Toast;

/**
 * Twitterアカウントの認証を行う。<br>
 *
 * @author Ippei Shimobou
 *
 */
public class TwitterLoginActivity extends Activity {
	private CommonsHttpOAuthConsumer consumer;
	private OAuthProvider provider;
	private ProgressDialog progressDialog = null;

	// 使用していないためコメントアウト  by Shimobou
	//private boolean OnOffState = false;

	@Override
	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);

	}

	@Override
	public void onResume(){
		super.onResume();
		doAouth();

	}

	/**
	 * Connection中 progressberを出す。
	 */
	private void doAouth() {
		/* Connection中 progressberを出す */
		progressDialog = new ProgressDialog(this);
		progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
		progressDialog.setMessage("Now,Connecting Twitter-Server ...");
		progressDialog.setCancelable(true);
		progressDialog.show();
		(new Thread(runnable)).start();
	}

	private Runnable runnable = new Runnable() {
		/**
		 * スレッド実行関数<br>
		 * 認証を行う。
		 */
		@Override
		public void run() {
			twiConnection();
			progressDialog.dismiss();
		}
	};

	/**
	 * OAuth認証を行う。
	 */
	private void twiConnection() {
		try {
			consumer = new CommonsHttpOAuthConsumer(Utility.consumerKey,
					Utility.consumerSecret);
			provider = new DefaultOAuthProvider(
					"http://twitter.com/oauth/request_token",
					"http://twitter.com/oauth/access_token",
					"http://twitter.com/oauth/authorize");

			// トークンの読み込み
			SharedPreferences pref = getSharedPreferences("token", MODE_PRIVATE);
			String token = pref.getString("token", "");
			String tokenSecret = pref.getString("tokenSecret", "");

			// 認証済み
			if (token.length() > 0 && tokenSecret.length() > 0) {
				consumer.setTokenWithSecret(token, tokenSecret);

				// updateStatus("Date>"+(new Date()).toString());
			}
			// 認証処理のためブラウザ起動
			else {
				String authUrl = provider.retrieveRequestToken(consumer,
						Utility.CALLBACKURL);
				Intent BrowserIntent = new Intent(Intent.ACTION_VIEW, Uri .parse(authUrl));
				BrowserIntent.setClassName("com.android.browser",
						"com.android.browser.BrowserActivity");
//				BrowserIntent.setData(Uri.parse(authUrl));
				this.startActivity(BrowserIntent
						/* new Intent(Intent.ACTION_VIEW, Uri .parse(authUrl))*/
						);
			}
		} catch (Exception e) {
			// 接続に失敗するとここへ落ちる。
			//Toast.makeText(TwitterLoginActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
			// TODO:ここでトースト出すとUIスレッドでないため落ちる。
			//       簡単な解決策が見つからないのでとりあえず落ちないようにしてログだけ吐いとく。
		}
	}

	/**
	 *  認証完了時に呼ばれる。<br>
	 *  すでにActivityが存在する状態で新しいIntentを受け取るを
	 *  呼び出される。<br>
	 */
	@Override
	protected void onNewIntent(Intent intent) {
		super.onNewIntent(intent);

		Uri uri = intent.getData();
		if (uri != null && uri.toString().startsWith(Utility.CALLBACKURL)) {
			String verifier = uri
					.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
			try {
				provider.retrieveAccessToken(consumer, verifier);

				// トークンの書き込み
				SharedPreferences pref = getSharedPreferences("token",
						MODE_PRIVATE);
				SharedPreferences.Editor editor = pref.edit();
				editor.putString("token", consumer.getToken());
				editor.putString("tokenSecret", consumer.getTokenSecret());
				editor.commit();
			} catch (Exception e) {
				Log.d("", e.getMessage());
			}

			// 認証完了後、設定画面に戻る。
			Intent backMenu = new Intent(this,
					com.udg.goodmorning.tweet.PreferenceMenu.class);
			startActivity(backMenu);
			finish();
		}
		// TODO: ブラウザで認証せずにここへ落ちてきた場合、設定画面に戻るのか？ by Shimobou
		finish();
	}

	/**
	 *  BackKey の処理禁止
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode != KeyEvent.KEYCODE_BACK){
			return super.onKeyDown(keyCode, event);
		}else{
			return false;
		}
	}

}